xmind 转换成 excel

您所在的位置:网站首页 xmind excel 区别 xmind 转换成 excel

xmind 转换成 excel

2024-07-12 03:59| 来源: 网络整理| 查看: 265

思路

思路直接使用 百码山庄 的文章 【原创】XMind免费到Excel的全过程。该文使用 nodejs / php 实现本功能,本文使用 python 实现。

转换 xmind 文件为 freemind .mm 后缀文件。 freemind 文件实为 xml 格式,通过解析 xml 文件,按格式导出为 excel。 freemind 格式分析

freemind 文件格式分析,xml 源码及 xmind mindmap 如下所示。

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677 乔老爷子 根节点 1` mindmap 节点 1 联系节点,即 xmind 中的箭头,ctrl + l 1 备注节点,node 节点的子节点。 12345 乔老爷子 概要节点,同 mindmap 节点 1 特殊标签 —— 图标 1 问题:xmind bug,图片所在节点的文字不会导出到 freemind 中。 1

综上,需归递解析出 freemind 的每个 node 标签,并分析是否为叶子节点,根据是否叶子节点判断excel row 是否加一,将 node 标签的 TEXT 属性值写入 excel 第 row 行,第 level 列。

第一版 —— xml 递归解析参考代码

参考代码,Python - How to determine hierarchy level of parsed XML elements? 中 pradyunsg 的回答,通过递归的获取子节点的形式达到获取 xml 等级的目的。

原代码:

123456789101112import xml.etree.ElementTree as ETdef perf_func(elem, func, level=0): func(elem,level) for child in elem.getchildren(): perf_func(child, func, level+1)def print_level(elem,level): print '-'*level+elem.tagroot = ET.parse('XML_file.xml')perf_func(root.getroot(), print_level) 适配到 freemind 的解析

实现获取属性 ‘TEXT’,参考 xml.etree.ElementTree — The ElementTree XML API。

12345678910111213141516#!/usr/bin/pythonimport xml.etree.ElementTree as ETdef perf_func(elem, func, level=0): func(elem,level) for child in elem.getchildren(): perf_func(child, func, level+1)def print_level(elem,level): name = elem.get('TEXT') if name is not None: print '-'*level + nameroot = ET.parse('test.xml')perf_func(root.getroot(), print_level)

使用到的 python 语法:

if 语句,通过 is not None 判断非空。 第二版 —— 导出为 excel

缺点:使用全局变量

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647#!/usr/bin/pythonimport xml.etree.ElementTree as ETimport xlwtg_row = 0def do_write_excel(text, row, col): print text + " row %d + col %d"%(row, col) ws.write(row, col, text) def perf_func(elem, func, level = 0): global g_row func(elem, g_row, level) # elem maybe not a node tag # if elem.tag is 'node': for child in list(elem): name = child.get('TEXT') perf_func(child, func, level + 1) if child.find('node') is None and name is not None: g_row = g_row + 1def write_excel(elem, row, level): name = elem.get('TEXT') if name is not None: do_write_excel(name, row, level) ''' if elem.find('node') is None and name is not None: print "leaf" + '-' * level + name elif name is not None: print '-' * level + name '''root = ET.parse('sde.xml')map_version = root.getroot()first_node = map_version.find('node')wb = xlwt.Workbook()ws = wb.add_sheet('freemind2excel')perf_func(first_node, write_excel)wb.save('freemind2excel.xls')

使用到的 Python 语法:

字符串判空,if a == b,注意 is 是用于判断是否同一个对象。 list 判空,if not a。

全局变量,在函数前定义,在函数内要定义为 global

etree.ElementTree

获取 elementTree 树对象,parse(source) 获取 element 对象,getroot 获取 tag 的值,elem.tag 获取首个标签为 node 的 element,elem.find(‘node’) 获取属性 TEXT 的值,elem.get(‘TEXT’)

xlwt

实例化,xlwt.workbook() 添加 sheet,add_sheet 保存 xls 文件,save 写数据,write 第三版 —— 带参数解析 python 参数解析内嵌库 argparse python 参数解析方法汇总,Python中的命令行解析工具介绍 python argparse 使用详解,argparse - 命令行选项与参数解析(译)

本文只需要带个参数,一是输入文件,二是输出文件,其中输入文件为必选选项,输出文件为可选,输出文件默认为 freemind2excel.xls。

源码:

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748#!/usr/bin/pythonimport xml.etree.ElementTree as ETimport xlwtimport argparseg_row = 0def do_write_excel(text, row, col): #print text + " row %d + col %d"%(row, col) ws.write(row, col, text) def perf_func(elem, func, level = 0): global g_row func(elem, g_row, level) for child in list(elem): name = child.get('TEXT') perf_func(child, func, level + 1) if child.find('node') is None and name is not None: g_row = g_row + 1def write_excel(elem, row, level): name = elem.get('TEXT') if name is not None: do_write_excel(name, row, level)parser = argparse.ArgumentParser()parser.add_argument('-i', '--input-file', type=str, dest='inputfile', required=True)parser.add_argument('-o', '--output-file', type=str, dest='outputfile', default='freemind2excel.xls', help='Default outputfile is freemind2excel.xls')args = parser.parse_args()if args.inputfile is None: parser.print_help() exit()root = ET.parse(args.inputfile)map_version = root.getroot()first_node = map_version.find('node')wb = xlwt.Workbook()ws = wb.add_sheet('freemind2excel')perf_func(first_node, write_excel)wb.save(args.outputfile)

运行结果:

123456789sunnogo@DESKTOP-VM2TU8I:~/workshop/xmind2excel$ ./xmind2excel.pyusage: xmind2excel.py [-h] -i INPUTFILE [-o OUTPUTFILE]xmind2excel.py: error: argument -i/--input-file is requiredsunnogo@DESKTOP-VM2TU8I:~/workshop/xmind2excel$ ./xmind2excel.py -i project_plan.mmsunnogo@DESKTOP-VM2TU8I:~/workshop/xmind2excel$ ls *.xlsfreemind2excel.xlssunnogo@DESKTOP-VM2TU8I:~/workshop/xmind2excel$ ./xmind2excel.py -i project_plan.mm -o test.xlssunnogo@DESKTOP-VM2TU8I:~/workshop/xmind2excel$ ls *.xlsfreemind2excel.xls test.xls


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3